﻿namespace Fiuba.Algo3.Titiritero
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.ComponentModel;

    public class ControladorJuego
    {
        public bool estaEnEjecucion;
        public double IntervaloSimulacion {get; set;}
        public ISuperficieDeDibujo superficieDeDibujo;
        private IList<IObjetoVivo> objetosVivos;
        private IList<IDibujable> dibujables;

        public ControladorJuego(ISuperficieDeDibujo superficieDeDibujo)
        {
            this.superficieDeDibujo = superficieDeDibujo;
            this.estaEnEjecucion = false;
            this.IntervaloSimulacion = 2000;
            this.objetosVivos = new List<IObjetoVivo>();
            this.dibujables= new List<IDibujable>();
        }

        public void ComenzarJuego()
        {
            BackgroundWorker delayer = new BackgroundWorker();

            delayer.DoWork += new DoWorkEventHandler(delayer_DoWork);
            delayer.RunWorkerAsync();

        }

        void delayer_DoWork(object sender, DoWorkEventArgs e)
        {
            ComenzarAsync();
        }

        public void ComenzarAsync()
        {
            estaEnEjecucion = true;
            while (estaEnEjecucion)
            {
                Simular();
                Dibujar();
                Thread.Sleep(TimeSpan.FromMilliseconds(this.IntervaloSimulacion));
            }
        }

        public void DetenerJuego()
        {
            this.estaEnEjecucion = false;
        }
	
        public void agregarObjetoVivo(IObjetoVivo objetoVivo)
        {
            objetosVivos.Add(objetoVivo);
        }

        public void removerObjetoVivo(IObjetoVivo objetoVivo)
        {
            objetosVivos.Remove(objetoVivo);
        }

        public void agregarDibujable(IDibujable unDibujable)
        {
            dibujables.Add(unDibujable);
        }

        public void removerDibujable(IDibujable unDibujable)
        {
            dibujables.Remove(unDibujable);
        }

        private void Dibujar()
        {
            this.superficieDeDibujo.Limpiar();
            foreach (IDibujable dibujable in this.dibujables)
            {
                dibujable.Dibujar(this.superficieDeDibujo);
            }
            this.superficieDeDibujo.Actualizar();
        }

        /**
         * Ejecuta la simulacion recorriendo la coleccion de objetivos vivos.
         */
        private void Simular()
        {
            foreach (IObjetoVivo objetoVivo in this.objetosVivos)
            {
                objetoVivo.Vivir();
            }
        }

    }
}
